package com.yc.annotation;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 作用：类orm：对象——>sql
 * 注解 + 反射 完成框架，方便解耦逻辑
 * 注解：单独的注解作用就是：“标记并记录一些信息”，如果不配合其他技术没什么意义
 * 注解的标记作用 和 记录的信息，拿来被其他技术利用，才有用
 * @author yuancan
 *
 */
public class Test {
	
	public static String query(Person person) {
		StringBuffer sb = new StringBuffer();
		Class p = person.getClass();
		boolean exist = p.isAnnotationPresent(Table.class);
		if (!exist) {
			return null;
		}
		
		Table table = (Table) p.getAnnotation(Table.class);
		String tableValue = table.value();
		
		sb.append("select * from ").append(tableValue).append(" where 1=1");
		Field[] fArr = p.getDeclaredFields();
		for (Field field : fArr) {
			boolean fExit = field.isAnnotationPresent(Cloumn.class);
			if(!fExit) {
				return null;
			}
			Cloumn cloumn = field.getAnnotation(Cloumn.class);
			String cloumnName = cloumn.value();
			String fieldName = field.getName();
			Object fieldValue = null;
			
			String getMedthodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
			try {
				Method method = p.getMethod(getMedthodName, null);
				fieldValue = method.invoke(person);
			} catch (Exception e) {
				e.printStackTrace();
			}
			sb.append(" and ").append(cloumnName).append("=").append(fieldValue);
		}
		return sb.toString();
	}

	public static void main(String[] args) {
		Person p = new Person();
		p.setName("aa");
		p.setUseName("bb");
		System.out.println(query(p));

	}

}
